package exercise_code;
/*
* 给你两个整数，n 和 start 。
数组 nums 定义为：nums[i] = start + 2*i（下标从 0 开始）且 n == nums.length 。
请返回 nums 中所有元素按位异或（XOR）后得到的结果。*/

import java.util.Scanner;

public class XOROperation {
    public static int xorOperation(int n, int start) {
        int a = start / 2;
        int b = n & start & 1;//都为奇数时才是1
        return (xorN(a + n - 1) ^ xorN(a - 1)) * 2 + b;
    }

    public static int xorN(int n) {
        return switch (n % 4) {
            case 0 -> n;
            case 1 -> 1;
            case 2 -> n + 1;
            default -> 0;
        };
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("n = ");
        int n = scanner.nextInt();
        System.out.print("start = ");
        int start = scanner.nextInt();
        System.out.println(xorOperation(n, start));
    }
}
/*
* 1.问题分析：数组中的每个元素都是 start 加上一个偶数（因为 2*i 是偶数）。这意味着所有元素的最低位相同，取决于 start 的最低位。
2.关键洞察：可以将问题分解为计算高位比特和最低位。首先，将每个元素右移一位得到序列 a + i，其中 a = start >> 1。
然后计算这个新序列的异或值，最后将结果左移一位并加上最低位的影响。
3.数学公式：计算从 a 到 a + n - 1 的连续整数异或值使用已知的模4公式，该公式高效且无需循环。
4.处理最低位：如果 n 是奇数，最低位为 start 的最低位；否则为0。*/